package kr.co.bettersoft.waitnumberstorem.fragment;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import kr.co.bettersoft.waitnumberstorem.activity.PullToRefreshListView.OnRefreshListener;
import kr.co.bettersoft.waitnumberstorem.activity.PullToRefreshListView;
import kr.co.bettersoft.waitnumberstorem.activity.R;

import kr.co.bettersoft.waitnumberstorem.adapter.WaitingUserListAdapter;
import kr.co.bettersoft.waitnumberstorem.adapter.WaitingUserRecentListAdapter;
import kr.co.bettersoft.waitnumberstorem.common.CommonConstant;
import kr.co.bettersoft.waitnumberstorem.common.SwipeListViewFragment;
import kr.co.bettersoft.waitnumberstorem.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstorem.domain.WaitingNumberStore;
import kr.co.bettersoft.waitnumberstorem.domain.WaitingUser;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemLongClickListener;

public class WaitUserListFragment extends SwipeListViewFragment{			
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수
		
		String TAG = "WaitUserListFragment";

		public final int GET_WAIT_PERSON_NUMBER = 601;  // 대기목록을 가져오기 전에 현재 대기중인 팀 수를 가져온다. 0명이면 안가져옴
//		public final int SELECT_RECENT_ADMISSTION_USER_LIST = 602; 			// 오늘 가장 최근에 등록/입장한 고객 2 팀의 목록을 가져 온다.		
		public final int GET_WAIT_LIST = 603; 			// 대기 목록을 가져온다. 그리고 입장모드일 경우 위에서 가져온 totalCount 정보에 따라 입장 처리도 함.
		public final int SELECT_REGISTER_TEAM_AND_USER = 604; 	//  최초 실행. 오늘 총 등록 팀수, 인원 수를 가져온다. 
		
		public final int ENTRANCE_NEXT_PERSON = 605; 			// 다음고객 입장		
		public final int UPDATE_USER_ADMISSIONYN_AND_USER_NEXTTURNYN = 606; 			// 다음고객 입장 (대기 2인 이상)
		public final int ENTRANCE_OTHER_PERSON = 607; 			// 우선 입장
		public final int UPDATE_DEACTIVATE_USER = 608; 			// 대기 취소	
		
		// 폰트
		private Typeface typefaceNanumGothic= null; 
		private Typeface typefaceNanumGothicBold = null;
		
		SharedPreferences sharedPrefCustom;	// 공용 프립스	

		// 프래그먼트 종료 여부. 종료된 경우 스레드 호출로 인한 에러를 방지하기 위함
		Boolean isFinished = false;
		
		Boolean entranceMode = false;
		
		// 서버 통신용
		static Boolean countOne = true;		// 한번에 한번만 통신 하도록
		WaitnumberStoreMRest waitnumberStoreMRest;
//		String callResult = "";
//		String tempstr = "";
//		JSONObject jsonObject;
		
		// 현 시각
		Date today ;
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String nowDate;
		String nowTime = "";	// 현시각

		Boolean needRefreshYn = false;	// 화면 새로고침 필요 여부 -> on Resume 에서도 화면 새로고침 하지만, 입장 이후에는 on Resume 이 수행되지 않으므로 별도로 수행시켜야 하기 때문.
		Boolean newSearch = true;       // 처음 검색인지 여부. 처음검색이면 어댑터에 세팅을, 처음이 아닌 추가라면 어댑터에 알림 . 
		
		// 데이터
		String todayTotalCount;		// 금일 총 인원
		String todayTotalTeam;		// 금일 총 팀수
		
		String totalCount;		// 대기 인원
		String resultStr;		// 요청 결과
		Boolean tmpFirstItem = true;		// 첫 아이템만 백그라운드 효과
		
		
		static String merchantId = "";	//	// 전달받은 가맹점 정보
		String nextIdWaitingUsers = "";	//	// 유저 정보 

		// 우선 입장 - 우선입장 포지션
		int firstEntrancePosition ;
		
		// 취소 - 취소 포지션
		public int cancelPosition;
		
		// 서버에서 받은 대기 인원 리스트 임시 저장
		int max = 0;
//		String tmpIdWaitingUsers = "";
//		String tmpUserName = "";
//		String tmpQrCode = "";
//		String tmpPhoneNumber = "";
//		String tmpNumberWaiting = "";
//		String tmpCompanion = "";
//		String tmpAdmissionYn = "";
//		String tmpNextTurnYn = "";
//		String tmpActivateYn = "";
//		String tmpModifyDate = "";
//		String tmpRegisterDate = "";
		
		// 대기인원 리스트
//		public ArrayList<WaitingUser> entries1 = new ArrayList<WaitingUser>();
		List<WaitingUser> entriesFn;				
		// 최근 입장 2인 인원 리스트
//		public ArrayList<WaitingUser> entriesRecent1 = new ArrayList<WaitingUser>();
		List<WaitingUser> entriesRecentFn;				
		
		private WaitingUserListAdapter waitingUserListAdapter;		// 그리드뷰 사용할 아답터
		private WaitingUserRecentListAdapter waitingUserRecentListAdapter;		// 최근입장인원용 그리드뷰 사용할 아답터

		// 화면 구성
		TextView titleBar;		// 타이틀
		TextView todayVisitCount;		// "금일 방문 인수"		
		TextView todayVisitTeam;		// "금일 방문 팀 수"
		
		Button  mainHomeNextTurnEnterBtn;			//  다음차례 입장 버튼 
		TextView mainHomeWaitUserNumber;		// 대기 인원수
		
		TextView mainHomeWaitUserNumberTotal;		// 금일 총 방문자수	 
		TextView mainWaitStatusWaitTeamTotal;		// 금일 총 방문팀수 
		
		// 대기리스트
		ListView waitUserListView;
		View emptyView;				// 데이터 없음 뷰
		// 최근입장 리스트
		ListView waitUserRecentListView;
		View emptyRecentView;				// 데이터 없음 뷰
		
		ProgressBar pb1;		// 중단 로딩 진행바

		// pull down refresh
		Boolean pullDownRefreshIng  = false;
		
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// 핸들러
		Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg){
				try{
					Bundle b = msg.getData();		
					
					if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기
						Toast.makeText(getActivity(), b.getString("msg"), Toast.LENGTH_SHORT).show();
					}
					if(b.getInt("showAlert")==1){					 // 경고창 . 
						//
						new AlertDialog.Builder(returnThis())
						.setTitle(CommonConstant. alertTitle )                                        
						.setMessage(b.getString("msg"))
						.setIcon(R.drawable.ic_dialog_img)		
						.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int whichButton) {
								// 단순 확인 용도
							}})
							.setNegativeButton("", null).show();
					}
					if(b.getInt("confirmAndEnterUser")==1){					 // 확인받고 입장시키기
						// 
						new AlertDialog.Builder(returnThis())
						.setTitle(CommonConstant. alertTitle )                                        
						.setMessage(getActivity().getString(R.string.confirm_wait_user_enter))	// 확인 질문
						.setIcon(R.drawable.ic_dialog_img)		
						.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int whichButton) {
								entranceMode = true;	// 입장 모드
								handler.sendEmptyMessage(GET_WAIT_PERSON_NUMBER);		// 대기 고객수를 먼저 구함. 이후 입장 모드에 따라 분기됨 !
							}})
							.setNegativeButton(getActivity().getString(R.string.no), null).show();
					}else if(b.getInt("confirmAndEnterUser")==2){					 // 확인받고 우선 입장시키기
						new AlertDialog.Builder(returnThis())
						.setTitle(CommonConstant. alertTitle )                                        
						.setMessage(getActivity().getString(R.string.confirm_wait_user_first_enter))	// 확인 질문
						.setIcon(R.drawable.ic_dialog_img)		
						.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int whichButton) {
								entranceMode = true;	// 입장 모드
								handler.sendEmptyMessage(ENTRANCE_OTHER_PERSON);		// 우선 입장 모드 !
							}})
							.setNegativeButton(getActivity().getString(R.string.no), null).show();
					}
					if(b.getInt("confirmAndCancelUser")==1){					 // 확인받고 대기 취소.
						// 뷰를 보여주도록 하고, 버튼 클릭시 호출 되도록 하기.
						new AlertDialog.Builder(returnThis())
						.setTitle(CommonConstant. alertTitle )                                        
						.setMessage(getActivity().getString(R.string.confirm_wait_user_cancel))	// 확인 질문
						.setIcon(R.drawable.ic_dialog_img)		
						.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int whichButton) {
//								entranceMode = true;	// 입장 모드
//								handler.sendEmptyMessage(GET_WAIT_PERSON_NUMBER);		// 대기 고객수를 먼저 구함. 이후 입장 모드에 따라 분기됨 !
								handler.sendEmptyMessage(UPDATE_DEACTIVATE_USER);	// 대기 취소 - 컨트롤러에서 처리
							}})
							.setNegativeButton(getActivity().getString(R.string.no), null).show();
					}
					
					if(b.getInt("showWaitNum")==1){		// 대기인원 세팅
						mainHomeWaitUserNumber.setText(totalCount);	
					}
					
					if(b.getInt("showListYN")==1){
						// 대기 목록 데이터를 화면에.. 
						if((entriesFn!=null)&&(entriesFn.size()>0)){
								setGriding();			// 항시 업뎃
							waitUserListView.setVisibility(View.VISIBLE);
							emptyView.setVisibility(View.GONE);
						}else{
							Log.d(TAG,"no data");
							waitUserListView.setEmptyView(emptyView);
							waitUserListView.setVisibility(View.GONE);
							emptyView.setVisibility(View.VISIBLE);
						}
						
						// 최근 입장2인 데이터를 화면에.. 
						if((entriesRecentFn!=null)&&(entriesRecentFn.size()>0)){
								setRecentGriding();			// 항시 업뎃
							waitUserRecentListView.setVisibility(View.VISIBLE);
//							emptyRecentView.setVisibility(View.GONE);
						}else{
							Log.d(TAG,"no recent user data");
//							waitUserRecentListView.setEmptyView(emptyRecentView);			
							waitUserRecentListView.setVisibility(View.GONE);
//							emptyRecentView.setVisibility(View.VISIBLE);
						}
					}
					
					// 금일 총인원 보여줌 
					if(b.getInt("showTodayTotalCount")==1){
						mainHomeWaitUserNumberTotal.setText(todayTotalCount);		// ### 보류
						mainWaitStatusWaitTeamTotal.setText(todayTotalTeam+"");		// ### 보류
					}
					
					if(b.getInt("order")==1){
						// 프로그래스바 실행
						pb1.setVisibility(View.VISIBLE);
					}else if(b.getInt("order")==2){
						// 프로그래스바  종료
						pb1.setVisibility(View.GONE);
					}
					
					switch (msg.what)
					{
						case GET_WAIT_PERSON_NUMBER : 
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableGetWaitPersonNumber());
							}
							break;
//						case SELECT_RECENT_ADMISSTION_USER_LIST : 	
//							if(getActivity()!=null) {		
//								getActivity().runOnUiThread(new RunnableSelectRecentAdmissionUserList());				
//							}
//							break;	
						case GET_WAIT_LIST : 
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableGetWaitList());
							}
							break;	
						case SELECT_REGISTER_TEAM_AND_USER : 
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableSelectRegisterTeamAndUser());		// ## @@ 
							}
							break;	
						case ENTRANCE_NEXT_PERSON : 
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableEntranceNextPerson());
							}
							break;	
						case UPDATE_USER_ADMISSIONYN_AND_USER_NEXTTURNYN : 
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableUpdateUserAdmissionYnAndUserNextTurnYn());
							}
							break;	
						case ENTRANCE_OTHER_PERSON : 
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableEntranceOtherPerson());
							}
							break;	
						case UPDATE_DEACTIVATE_USER : 		
							if(getActivity()!=null) {
								getActivity().runOnUiThread(new RunnableUpdateDeactivateUser());
							}
							break;	
						default : 
							break;
					}

				}catch(Exception e){
					e.printStackTrace();
				}
			}
		};

		/**
		 * setRecentGriding
		 * 최근 입장 데이터를 화면에 세팅한다
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void setRecentGriding(){
			waitingUserRecentListAdapter = new WaitingUserRecentListAdapter(getActivity(),this, entriesRecentFn);
			waitUserRecentListView.setAdapter(waitingUserRecentListAdapter);
		}
		/**
		 * setGriding
		 * 데이터를 화면에 세팅한다
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void setGriding(){
			waitingUserListAdapter = new WaitingUserListAdapter(getActivity(),this, entriesFn);
			waitUserListView.setAdapter(waitingUserListAdapter);
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		@Override
		public ListView getListView() {
			return waitUserListView;
		}

		@Override
		public void getSwipeItem(boolean isRight, int position) {
			if(waitUserListView.getCount()==entriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
				cancelPosition = position;
			}else{
				cancelPosition = position -1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
			}
			
			// 밀면 우측 숨겨진 버튼이 보이도록 하기.
			if(isRight){		// 오른쪽으로 밀면 숨김
				entriesFn.get(cancelPosition).setShowCancelBtnYn(false);
			}else{				// 왼쪽으로 밀면 생김
				entriesFn.get(cancelPosition).setShowCancelBtnYn(true);
			}
			waitingUserListAdapter.notifyDataSetChanged();
		}
		
		@Override
		public void onItemClickListener(ListAdapter adapter, int position) {
		}
		@Override
		public void onItemLongClickListener(ListAdapter adapter, int position) {
			if(waitUserListView.getCount()==entriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
				firstEntrancePosition = position;
			}else{
				firstEntrancePosition = position -1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
			}
			if(firstEntrancePosition!=0){		// 0 번째는 우선 입장 기능 x. 일반 입장o
				confirmAndEnterUser2();
			}else{
				confirmAndEnterUser();			// 0번째에게는 일반 입장창이라도 뜨게 함. (0번째만 안뜨니 이상해서)
			}
		}
		
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
		{
			View view = inflater.inflate(R.layout.fragment_wait_user_list, null);

			waitnumberStoreMRest = new WaitnumberStoreMRest();
			
			titleBar = (TextView) view.findViewById(R.id.title_bar);
			todayVisitCount = (TextView) view.findViewById(R.id.today_visit_count);
			todayVisitTeam = (TextView) view.findViewById(R.id.today_visit_team);
		    
			
			waitUserListView = (ListView) view.findViewById(R.id.wait_user_list_view);		
			emptyView = view.findViewById(R.id.empty1);		// 데이터 없으면 '빈 페이지'(데이터 없음 메시지)표시
			
			waitUserRecentListView = (ListView) view.findViewById(R.id.wait_user_recent_list_view);			
			emptyRecentView = view.findViewById(R.id.empty_recent1);		// 데이터 없으면 '빈 페이지'(데이터 없음 메시지)표시	emptyRecentView
			  
			
			
			
			
			pb1=(ProgressBar) view.findViewById(R.id.main_wait_status_progressbar);
			
			// 가맹점 아이디를 꺼낸다.
			sharedPrefCustom = getActivity().getSharedPreferences(CommonConstant.prefName,
					Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
			merchantId = sharedPrefCustom.getString("merchantId", "");
			
			mainHomeNextTurnEnterBtn = (Button) view.findViewById(R.id.main_wait_status_next_turn_enter_btn);
			mainHomeWaitUserNumber = (TextView) view.findViewById(R.id.main_wait_status_wait_user_number);
			mainHomeWaitUserNumberTotal = (TextView) view.findViewById(R.id.main_wait_status_wait_user_total);
			mainWaitStatusWaitTeamTotal = (TextView) view.findViewById(R.id.main_wait_status_wait_team_total);
				

			// 폰트 지정.
		    typefaceNanumGothic = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothic);  
		    typefaceNanumGothicBold = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothicBold);
		    // 폰트 적용
		    titleBar.setTypeface(typefaceNanumGothic);	
		    todayVisitCount.setTypeface(typefaceNanumGothic);	
		    todayVisitTeam.setTypeface(typefaceNanumGothic);	
		    mainHomeWaitUserNumberTotal.setTypeface(typefaceNanumGothic);	
		    mainWaitStatusWaitTeamTotal.setTypeface(typefaceNanumGothic);	
		    mainHomeNextTurnEnterBtn.setTypeface(typefaceNanumGothicBold);	
		    
		    		
			
			// 대기 입장 버튼 리스너
			mainHomeNextTurnEnterBtn.setOnClickListener(new OnClickListener() {		// 대기 입장 버튼
				@Override
				public void onClick(View v) {
					Log.d(TAG,"mainHomeNextTurnEnterBtn click");
					if(entriesFn==null || entriesFn.size()<1){
						Log.d(TAG,"no waiting users..");
					}else{
						confirmAndEnterUser();	
					}
				}
			});
			
			// 금일 방문 인 수 터치시 방문 목록으로 이동
			mainHomeWaitUserNumberTotal.setOnClickListener(new OnClickListener() {		// 대기 입장 버튼
				@Override
				public void onClick(View v) {
					Log.d(TAG,"mainHomeWaitUserNumberTotal click");
					Intent intent = new Intent(getActivity(), kr.co.bettersoft.waitnumberstorem.activity.MainSettingsTodayUserListActivity.class);
					startActivity(intent);
				}
			});
			
			
			////////////////////////////////pull down list
			// Set a listener to be invoked when the list should be refreshed.
	        ((PullToRefreshListView) waitUserListView).setOnRefreshListener(new OnRefreshListener() {
	            @Override
	            public void onRefresh() {
	                // Do work to refresh the list here.
	            	if(countOne){
		    			countOne = false;		
		    				try {
		    					pullDownRefreshIng = true;				// 기본 로딩바는 보여주지 않기 위함
		    					new GetDataTask().execute();
		    				}catch (Exception e) {
		    					e.printStackTrace();
		    				} 
		    		}else{
		    			Log.d(TAG,"already running..");		 
		    			((PullToRefreshListView) waitUserListView).onRefreshComplete();
		    		}
	                
	            }
	        });
	        
	        if(countOne){
				countOne = false;		
				entranceMode = false;
				handler.sendEmptyMessage(SELECT_REGISTER_TEAM_AND_USER);		// (oncreate) 금일 총인원 먼저 가져온다  
			}else{
				Log.d(TAG,"already running..");		 
			}
	        
	        return view;
		}


		
//	//////////////////////////////////////////////////////////////////////////////////////////////////////
		// pull down list
			
			private class GetDataTask extends AsyncTask<Void, Void, String[]> {
		        @Override
		        protected String[] doInBackground(Void... params) {
		            // Simulates a background job.
		        	Log.d(TAG,"GetDataTask");
		        	
		        	// 총 대기 인원 구하기. 직접 호출.
		        	// 파라미터 세팅
					WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
					waitingNumberStore.setMerchantId(merchantId);
					
					// 서버 메소드 호출
					if(FragmentHome.restCallCntUp()){
						if(!isFinished){
							String callResult = waitnumberStoreMRest.RestSelectUserTotalCountToday(waitingNumberStore);
							// 결과 처리
							if(!(callResult.equals("F"))){
								processTodayTotalCountTodayData(callResult);
							}
						}
						FragmentHome.restCallCntDown();
					}
					
		        	/*
		        	 * 방법 1. 메시지만 전달하고 끝냄. 자체 로딩 대신 화면 중앙 로딩 보여줌 
		        	 */
//		        	handler.sendEmptyMessage(GET_WAIT_PERSON_NUMBER);
		        	/*
		        	 * 방법 2. 코드 가져와서 직접 수행. 자체 로딩 보여주게 됨. 
		        	 */
					// 파라미터 세팅
					waitingNumberStore = new WaitingNumberStore();
					waitingNumberStore.setMerchantId(merchantId);
					
					// 서버 메소드 호출
					if(FragmentHome.restCallCntUp()){
						if(!isFinished){
							String callResult = waitnumberStoreMRest.RestGetWaitPersonNumber(waitingNumberStore);
							// 결과 처리
							if(!(callResult.equals("F"))){
//								tempstr = waitnumberStoreMRest.getTempstr();
								
								try {
									// 데이터 세팅부..
									JSONObject jsonObject = new JSONObject(callResult);
									try{
										totalCount = jsonObject.getString("totalCount");
										if(totalCount==null || totalCount.equals("null")){
											totalCount = "0";
										}
									}catch(Exception e){
										totalCount = "0";
									}
									showWaitNum();
								} catch (JSONException e) {
									e.printStackTrace();
								} 
							}
							
						}
						FragmentHome.restCallCntDown();
					}
					
						
					if(!totalCount.equals("0")){
						/*
						 * 방법 1. 메시지만 전달 
						 */
//						handler.sendEmptyMessage(GET_WAIT_LIST);
						/*
						 * 방법 2. 직접 수행 
						 */
						// 파라미터 세팅
						waitingNumberStore = new WaitingNumberStore();
						waitingNumberStore.setMerchantId(merchantId);
						
						// 서버 메소드 호출
						if(FragmentHome.restCallCntUp()){
							if(!isFinished){
								
								if(!entranceMode){				
									// 최근 입장 2인 목록 
									String callResult = waitnumberStoreMRest.RestSelectRecentAdmissionUserList(waitingNumberStore);
									// 결과 처리
									if(!(callResult.equals("F"))){
										processRecentWaitStatusData(callResult);
									}
								}
								// 대기 목록
								String callResult = waitnumberStoreMRest.RestGetWaitList(waitingNumberStore);
								
								// 결과 처리
								if(!(callResult.equals("F"))){
//									tempstr = waitnumberStoreMRest.getTempstr();
									processWaitStatusData(callResult);
								}
							}
							FragmentHome.restCallCntDown();
						}
					}else{
						entriesFn = null;
						try {
							threadShowList();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
					countOne = true;		// 다시 호출 되도록 수정..	
		            return null;
		        }
		        @Override
		        protected void onPostExecute(String[] result) {
		            // Call onRefreshComplete when the list has been refreshed.
		        	pullDownRefreshIng = false;							// 기본 로딩바 보여주기 상태 초기화. resume 기능으로는 보여지도록.
		            ((PullToRefreshListView) waitUserListView).onRefreshComplete();		// 리프레시가 끝났음을....
		            super.onPostExecute(result);
		        }
		    }
		
		
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 자체 사용 메소드

		// 화면에 있는 고객 정보 초기화. 
		/**
		 * init
		 *  화면에 있는 고객 정보 초기화한다.
		 *
		 * @param 
		 * @param
		 * @return
		 */
		public void init(){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("init", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		
		/**
		 * 화면에 대기중인 고객 숫자를 보여준다.
		 * showWaitNum
		 */
		public void showWaitNum(){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showWaitNum", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		
		/**
		 * confirmAndEnterUser
		 *  확인 받고 입장 시킨다.
		 *
		 * @param msg
		 * @param
		 * @return 
		 */
		public void confirmAndEnterUser(){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("confirmAndEnterUser", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
			
		}
		/**
		 * confirmAndEnterUser
		 *  확인 받고 우선 입장 시킨다.
		 *
		 * @param msg
		 * @param
		 * @return 
		 */
		public void confirmAndEnterUser2(){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("confirmAndEnterUser", 2);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
			
		}
		
		/**
		 * confirmAndCancelUser
		 *  확인 후 대기 취소 
		 *
		 * @param msg
		 * @param
		 * @return 
		 */
		public void confirmAndCancelUser(){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("confirmAndCancelUser", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		 
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		
		/**
		 * 러너블. 대기 인원 수를 가져온다.
		 */
		class RunnableGetWaitPersonNumber implements Runnable {
			public void run(){
				new backgroundThreadGetWaitPersonNumber().execute();
			}
		}
		/**
		 * backgroundThreadGetWaitPersonNumber
		 * 비동기 스레드  대기 인원 수를 가져온다.
		 * @author blue
		 *
		 */
		public class backgroundThreadGetWaitPersonNumber extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadGetWaitPersonNumber");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
				waitingNumberStore.setMerchantId(merchantId);
				
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
					if(entranceMode){
						 showPb();		// 입장모드라서 독립 수행되었을때만 pb 띄움
					}
					if(!isFinished){
						String callResult = waitnumberStoreMRest.RestGetWaitPersonNumber(waitingNumberStore);
						// 결과 처리
						if(!(callResult.equals("F"))){
							try {
								// 데이터 세팅부..
								JSONObject jsonObject = new JSONObject(callResult);
								try{
									totalCount = jsonObject.getString("totalCount");
									if(totalCount==null || totalCount.equals("null")){
										totalCount = "0";
									}
								}catch(Exception e){
									totalCount = "0";
								}
								showWaitNum();
							} catch (JSONException e) {
								e.printStackTrace();
							} 
						}
					}
//					hidePb();		// @@ 
					FragmentHome.restCallCntDown();
				}
				countOne = true;		// 다시 호출 되도록 수정..	
				if(totalCount==null || totalCount.equals("null")){
					Log.d(TAG,"totalCount==null");
					totalCount = "0";
				}
				
				/*
				 * 무조건 호출하도록 변경.(최근입장시킨 인원 정보가 필요함) 
				 */
				handler.sendEmptyMessage(GET_WAIT_LIST);		// (현재 대기인원 구하고 나서 자동)
//				if(!totalCount.equals("0")){
//					// --> 바로 대기 리스트 가져온다.
//					handler.sendEmptyMessage(GET_WAIT_LIST);		// (현재 대기인원 구하고 나서 자동) 
//				}else{
//					entriesFn = null;
//					try {
//						threadShowList();
//						hidePb();
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
				
				
				return null; 
			}
		}
		
		
		/**
		 * 러너블. 대기 목록을 가져온다.     + // 오늘 가장 최근에 등록/입장한 고객 2 팀의 목록을 가져 온다.	
		 */
		class RunnableGetWaitList implements Runnable {
			public void run(){
				new backgroundThreadGetWaitList().execute();
			}
		}
		/**
		 * backgroundThreadGetWaitList
		 * 비동기 스레드.  대기 목록을 가져온다.
		 * @author blue
		 */
		public class backgroundThreadGetWaitList extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadGetWaitList");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
				waitingNumberStore.setMerchantId(merchantId);
				
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
//					showPb();	// 진행중이니까 자연스럽게.
					if(!isFinished){
						// 입장처리시에는 조회하지 않아도 됨.
						if(!entranceMode){				
							// 최근 입장 2인 목록 
							String callResult = waitnumberStoreMRest.RestSelectRecentAdmissionUserList(waitingNumberStore);
							// 결과 처리
							if(!(callResult.equals("F"))){
								processRecentWaitStatusData(callResult);
							}
						}
						
						// 대기 목록
						String callResult = waitnumberStoreMRest.RestGetWaitList(waitingNumberStore);
						// 결과 처리
						if(!(callResult.equals("F"))){
							processWaitStatusData(callResult);
						}
					}
					FragmentHome.restCallCntDown();
				}
				countOne = true;		// 다시 호출 되도록 수정..	
				return null; 
			}
		}
		
		/**
		 * 러너블. 오늘 총 등록 팀수, 인원수를 가져온다. 
		 */
		class RunnableSelectRegisterTeamAndUser implements Runnable {
			public void run(){
				new backgroundThreadSelectRegisterTeamAndUser().execute();
			}
		}
		/**
		 * backgroundThreadSelectRegisterTeamAndUser
		 * 비동기 스레드.  오늘 총 등록 팀수, 인원수를 가져온다.  
		 * @author blue
		 */
		public class backgroundThreadSelectRegisterTeamAndUser extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadSelectRegisterTeamAndUser");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
				waitingNumberStore.setMerchantId(merchantId);
				// 서버 메소드 호출
				showPb();
				String callResult = waitnumberStoreMRest.RestSelectRegisterTeamAndUser(waitingNumberStore);
				// 결과 처리
				if(!(callResult.equals("F"))){
					processTodayTotalCountTodayData(callResult);
				}
				handler.sendEmptyMessage(GET_WAIT_PERSON_NUMBER);		// 대기 인원수 가져온다. 
//				handler.sendEmptyMessage(GET_WAIT_LIST);				// 대기 리스트 가져온다. (오늘 총 인원 구하고 나서 자동)
				return null; 
			}
		}
		
		
		
		/**
		 * 러너블. 다음고객 입장
		 */
		class RunnableEntranceNextPerson implements Runnable {
			public void run(){
				new backgroundThreadEntranceNextPerson().execute();
			}
		}
		/**
		 * backgroundThreadEntranceNextPerson
		 * 비동기 스레드 다음고객 입장
		 * @author blue
		 *
		 */
		public class backgroundThreadEntranceNextPerson extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadEntranceNextPerson");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStoreParam = new WaitingNumberStore();
				waitingNumberStoreParam.setMerchantId(merchantId);
				WaitingUser waitingUserParam = new WaitingUser();
				waitingUserParam.setIdWaitingUsers(entriesFn.get(0).getIdWaitingUsers());
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
//					showPb();
					if(!isFinished){
						String callResult = waitnumberStoreMRest.RestEntranceNextPerson(waitingNumberStoreParam, waitingUserParam);
						// 결과 처리
						entranceMode = false;		// 사실 이전에 처리됨 
						if(callResult.equals("fail")||callResult.equals("FAIL")){
							Log.d(TAG,"entranceNextPerson FAIL");
						}else if(callResult.equals("SUCCESS")){
							Log.d(TAG,"entranceNextPerson SUCCESS");
							// 입장 성공.
							needRefreshYn = true;	// 입장에 대한 함수가 호출되었으므로 화면 갱신이 필요함 - 그에 따른 처리를 next turn 업데이트 이후 하게 됨.

							// 화면 갱신은 금일 총인원으로 시작
							handler.sendEmptyMessage(SELECT_REGISTER_TEAM_AND_USER);	
							showResultDialog(getActivity().getString(R.string.enter_success));		 
						}else{
							Log.d(TAG,"entranceNextPerson FAIL");
						}
					}
					hidePb();
					FragmentHome.restCallCntDown();
				}
				
				
				
				return null; 
			}
		}

		
		
		/**
		 * 러너블. 다음고객 입장 (대기 2인 이상)
		 */
		class RunnableUpdateUserAdmissionYnAndUserNextTurnYn implements Runnable {
			public void run(){
				new backgroundThreadUpdateUserAdmissionYnAndUserNextTurnYn().execute();
			}
		}
		/**
		 * backgroundThreadUpdateUserAdmissionYnAndUserNextTurnYn
		 * 비동기 스레드. 다음고객 입장 (대기 2인 이상)
		 * @author blue
		 *
		 */
		public class backgroundThreadUpdateUserAdmissionYnAndUserNextTurnYn extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadUpdateUserAdmissionYnAndUserNextTurnYn");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStoreParam = new WaitingNumberStore();
				waitingNumberStoreParam.setMerchantId(merchantId);
				WaitingUser waitingUserParam = new WaitingUser();
				waitingUserParam.setAdmissionYn(entriesFn.get(0).getIdWaitingUsers());	// 입장 고객 아이디
				waitingUserParam.setNextTurnYn(entriesFn.get(1).getIdWaitingUsers());	// 다음 고객 아이디
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
//					showPb();
					if(!isFinished){
						String callResult = waitnumberStoreMRest.RestUpdateUserAdmissionYnAndUserNextTurnYn(waitingNumberStoreParam, waitingUserParam);
						// 결과 처리
						entranceMode = false;		// 사실 이전에 처리됨 
						if(callResult.equals("fail")||callResult.equals("FAIL")){
							Log.d(TAG,"entranceNextPerson FAIL");
							hidePb();
						}else if(callResult.equals("SUCCESS")){
							Log.d(TAG,"entranceNextPerson SUCCESS");
							// 입장 성공.
							needRefreshYn = true;	// 입장에 대한 함수가 호출되었으므로 화면 갱신이 필요함 - 그에 따른 처리를 next turn 업데이트 이후 하게 됨.
							
							// 화면 갱신은 금일 총인원으로 시작
							handler.sendEmptyMessage(SELECT_REGISTER_TEAM_AND_USER);
							showResultDialog(getActivity().getString(R.string.enter_success));		 
						}else{
							Log.d(TAG,"entranceNextPerson FAIL");
							hidePb();
						}
					}
					hidePb();
					FragmentHome.restCallCntDown();
				}
				return null; 
			}
		}

		
		/**
		 * 러너블. 우선 입장
		 */
		class RunnableEntranceOtherPerson implements Runnable {
			public void run(){
				new backgroundThreadEntranceOtherPerson().execute();
			}
		}
		/**
		 * backgroundThreadEntranceOtherPerson
		 * 비동기 스레드  우선 입장
		 * @author blue
		 *
		 */
		public class backgroundThreadEntranceOtherPerson extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadEntranceOtherPerson");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStoreParam = new WaitingNumberStore();
				waitingNumberStoreParam.setMerchantId(merchantId);
				WaitingUser waitingUserParam = new WaitingUser();
				waitingUserParam.setIdWaitingUsers(entriesFn.get(firstEntrancePosition).getIdWaitingUsers());	// 입장할 고객 고유번호
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
					showPb();
					if(!isFinished){
						String callResult = waitnumberStoreMRest.RestEntranceOtherPerson(waitingNumberStoreParam, waitingUserParam);
						// 결과 처리
						entranceMode = false;		// 사실 이전에 처리됨 
						if(callResult.equals("fail")||callResult.equals("FAIL")){
							Log.d(TAG,"entranceNextPerson FAIL");
						}else if(callResult.equals("SUCCESS")){
							Log.d(TAG,"entranceNextPerson SUCCESS");
							// 입장 성공.
							needRefreshYn = true;	// 입장에 대한 함수가 호출되었으므로 화면 갱신이 필요함 - 그에 따른 처리를 next turn 업데이트 이후 하게 됨.
							
							// 화면 갱신은 금일 총인원으로 시작
							handler.sendEmptyMessage(SELECT_REGISTER_TEAM_AND_USER);
							showResultDialog(getActivity().getString(R.string.enter_success));		 
						}else{
							Log.d(TAG,"entranceNextPerson FAIL");
						}
					}
					hidePb();
					FragmentHome.restCallCntDown();
				}
				
				return null; 
			}
		}
		
		
		/**
		 * 러너블. 대기 취소
		 */
		class RunnableUpdateDeactivateUser implements Runnable {
			public void run(){
				new backgroundThreadUpdateDeactivateUser().execute();
			}
		}
		/**
		 * backgroundThreadUpdateDeactivateUser
		 * 비동기 스레드  대기 취소
		 * @author blue
		 *
		 */
		public class backgroundThreadUpdateDeactivateUser extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadUpdateDeactivateUser");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStoreParam = new WaitingNumberStore();
				waitingNumberStoreParam.setMerchantId(merchantId);
				WaitingUser waitingUserParam = new WaitingUser();
				waitingUserParam.setIdWaitingUsers(entriesFn.get(cancelPosition).getIdWaitingUsers());	// 취소할 고객 고유번호 ??
				
				String callResult="";
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
					showPb();
					if(!isFinished){
						
						if(cancelPosition==0 && entriesFn.size()>1){	// 두명 이상 + 첫 손님 취소
							Log.d(TAG,"cancel 1p and update");
							waitingUserParam.setIdWaitingUsers(entriesFn.get(cancelPosition).getIdWaitingUsers());			// 취소 대상(첫손님)
							waitingUserParam.setIdWaitingUsersNextTurnYn(entriesFn.get(cancelPosition+1).getIdWaitingUsers());	// 다음 사람 아이디
							
							Log.d(TAG,"entriesFn.get(cancelPosition).getIdWaitingUsers():"+entriesFn.get(cancelPosition).getIdWaitingUsers());
							Log.d(TAG,"entriesFn.get(cancelPosition+1).getIdWaitingUsers():"+entriesFn.get(cancelPosition+1).getIdWaitingUsers());
							
							callResult = waitnumberStoreMRest.RestUpdateDeactivateUserAndNextTurnYn(waitingNumberStoreParam, waitingUserParam);
						}else{ // 그외
							Log.d(TAG,"cancel 1p");
							waitingUserParam.setIdWaitingUsers(entriesFn.get(cancelPosition).getIdWaitingUsers());
							callResult = waitnumberStoreMRest.RestUpdateDeactivateUser(waitingNumberStoreParam, waitingUserParam);
						}
						
						// 결과 처리
						if(callResult.equals("fail")||callResult.equals("FAIL")){
							Log.d(TAG,"cancel wait Person FAIL");
							showResultDialog(getActivity().getString(R.string.request_failed));		
						}else if(callResult.equals("SUCCESS")){
							Log.d(TAG,"cancel wait Person SUCCESS");
							// 취소 성공.
							needRefreshYn = true;	//  함수가 호출되었으므로 화면 갱신이 필요함 - 그에 따른 처리를 next turn 업데이트 이후 하게 됨.
							
							// 화면 갱신은 금일 총인원으로 시작
							handler.sendEmptyMessage(SELECT_REGISTER_TEAM_AND_USER);
							showResultDialog(getActivity().getString(R.string.wait_cancel_success));		 	
						}else{
							Log.d(TAG,"cancel wait Person FAIL");
							showResultDialog(getActivity().getString(R.string.request_failed));		
						}
					}
					hidePb();
					FragmentHome.restCallCntDown();
				}
				
				return null; 
			}
		}


		
		
		
		/**
		 *  스레드를 사용하여 화면에 대기리스트 보여준다  + 최근 입장 인원 출력 기능도 함께 수행
		 */
		public void threadShowList() throws Exception{
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showListYN", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		/**
		 *  스레드를 사용하여 화면에 금일 총인원을 보여준다.
		 */
		public void threadShowTodayTotalCount() throws Exception{
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showTodayTotalCount", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
			
		}
		
	///////////////////////////////////////////////////////////////////////////////////////////////////////
		
		
		/**
		 * 서버로부터 받아온 금일 총 인원,팀 처리하여 화면에 보여준다.
		 */
		public void processTodayTotalCountTodayData(String callResult){
			try {
				// 데이터 세팅부..
				JSONObject jsonObj = new JSONObject(callResult);
				try{
					todayTotalTeam = jsonObj.getString("registerTeamCount");		// registerPersonCount registerTeamCount
					if(todayTotalTeam==null || todayTotalTeam.length()<1 || todayTotalTeam.equals("null")){
						todayTotalTeam = "0";
					}
				}catch(Exception e){
					todayTotalTeam = "0";
				}
				try{
					todayTotalCount = jsonObj.getString("registerPersonCount");		// registerPersonCount registerTeamCount
					if(todayTotalCount==null || todayTotalCount.length()<1 || todayTotalCount.equals("null")){
						todayTotalCount = "0";
					}
				}catch(Exception e){
					todayTotalCount = "0";
				}
			} catch (Exception e) {
				todayTotalTeam = "0";
				todayTotalCount = "0";
				e.printStackTrace();
			}
			try{
				threadShowTodayTotalCount();
			}catch(Exception e){
				e.printStackTrace();
			}
			countOne = true;
		}
		
		
		/**
		 * 서버로부터 받아온 최근 입장 2인 목록 데이터를 처리하여 화면에 보여준다.
		 */
		public void processRecentWaitStatusData(String callResult){
			try {
				// 데이터 세팅부..
//				Log.d(TAG,"processRecentWaitStatusData tempstr:"+tempstr);
				JSONArray jsonArray = null;
				jsonArray = new JSONArray(callResult);
				max = jsonArray.length();			
				
				String tmpIdWaitingUsers = "";
				String tmpUserName = "";
				String tmpQrCode = "";
				String tmpPhoneNumber = "";
				String tmpNumberWaiting = "";
				String tmpCompanion = "";
				String tmpAdmissionYn = "";
				String tmpNextTurnYn = "";
				String tmpActivateYn = "";
				String tmpModifyDate = "";
				String tmpRegisterDate = "";
				
				if(max>0){		
					entriesRecentFn = new ArrayList<WaitingUser>(max);
					for ( int i = 0; i < max; i++ ){			
						JSONObject jsonObj;
						try {
							jsonObj = jsonArray.getJSONObject(i);	
							String tmpRegisterDate2 = "";	// 형식 변환해서 저장용
							int dayOfRegisterDate = 0;	// 오전 오후 분간용
							String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
							String strAMPM = "";
							try{
								tmpIdWaitingUsers =jsonObj.getString("idWaitingUsers");
							}catch(Exception e){
								tmpIdWaitingUsers = "";
							}
							try{
								tmpUserName =jsonObj.getString("userName");
							}catch(Exception e){
								tmpUserName = "";
							}
							try{
								tmpQrCode =jsonObj.getString("qrCode");
							}catch(Exception e){
								tmpQrCode = "";
							}
							try{
								tmpPhoneNumber =jsonObj.getString("phoneNumber");
							}catch(Exception e){
								tmpPhoneNumber = "";
							}
							try{
								tmpNumberWaiting =jsonObj.getString("numberWaiting");
							}catch(Exception e){
								tmpNumberWaiting = "";
							}
							try{
								tmpCompanion =jsonObj.getString("companion");
							}catch(Exception e){
								tmpCompanion = "";
							}
							try{
								tmpAdmissionYn =jsonObj.getString("admissionYn");
							}catch(Exception e){
								tmpAdmissionYn = "";
							}
							try{
								tmpNextTurnYn =jsonObj.getString("nextTurnYn");
							}catch(Exception e){
								tmpNextTurnYn = "";
							}
							try{
								tmpActivateYn =jsonObj.getString("activateYn");
							}catch(Exception e){
								tmpActivateYn = "";
							}
							try{
								tmpRegisterDate =jsonObj.getString("registerDate");
								
								// 길면 자르기
								if(tmpRegisterDate!=null &&(tmpRegisterDate.length()>19)){
									tmpRegisterDate = tmpRegisterDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
								}
								
								// 오전 오후 분간하기
								dayOfRegisterDate = Integer.parseInt(tmpRegisterDate.substring(11, 13));	// dayOfRegisterDate
								if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
									dayOfRegisterDate = dayOfRegisterDate - 12;
									strAMPM = getActivity().getString(R.string.pm_of_day)+"";
								}else{				// 12시 이전 = 오전
									strAMPM = getActivity().getString(R.string.am_of_day)+"";
								}
								
								// 두자리로 맞추기.
								dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
								if(dayOfRegisterDate<10){		
									dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
								}
								
//								// 원하는 날짜 형식에 맞춰서 데이터 넣기
//								tmpRegisterDate2 = tmpRegisterDate.substring(0, 4)+getActivity().getString(R.string.year) +tmpRegisterDate.substring(5, 7) + getActivity().getString(R.string.month) + tmpRegisterDate.substring(8, 10) + getActivity().getString(R.string.day) + " " + strAMPM + " " + dayOfRegisterDateStr + tmpRegisterDate.substring(13);
								
								// 원하는 날짜 형식에 맞춰서 데이터 넣기
								tmpRegisterDate2 = 
									tmpRegisterDate.substring(0, 4)+getString(R.string.year) 
									+tmpRegisterDate.substring(5, 7) + getString(R.string.month) 
									+tmpRegisterDate.substring(8, 10) + getString(R.string.day) 
									+ " " + strAMPM + " " 
									+dayOfRegisterDateStr + getString(R.string.hour) 
									+tmpRegisterDate.substring(14, 16) + getString(R.string.minute) 
									+tmpRegisterDate.substring(17, 19) + getString(R.string.seconds);
//									+tmp_registerDate.substring(13);
								tmpRegisterDate = tmpRegisterDate2;	
								
								
							}catch(Exception e){
								tmpRegisterDate2 = "";
							}
							try{
								tmpModifyDate =jsonObj.getString("modifyDate");
							}catch(Exception e){
								tmpModifyDate = "";
							}
							
							entriesRecentFn.add(
									new WaitingUser(
											tmpIdWaitingUsers,
											tmpUserName,
											tmpQrCode,		
											tmpPhoneNumber,
											tmpNumberWaiting,
											tmpCompanion,
											tmpAdmissionYn, 
											tmpNextTurnYn,
											tmpActivateYn,
											tmpRegisterDate2,
											tmpModifyDate,
											tmpFirstItem
									)
							);
							tmpFirstItem = false;
						} catch (JSONException e) {
							e.printStackTrace();
						} 
					}
//					entriesRecentFn = entriesRecent1;
					
					// 순서를 역순으로 바꾼다
					entriesRecentFn = reverseEntriesRecentFn(entriesRecentFn);
					
				}else{		// 데이터 없음.
					entriesRecentFn = null;
				}
			} catch (JSONException e) {
				e.printStackTrace();
			} 
		}
		// 최근 입장 고객 순서를 역순으로 바꾼다
		public List<WaitingUser> reverseEntriesRecentFn(List<WaitingUser> entriesRecentFn){
			List<WaitingUser> tempEntriesRecentFn = new ArrayList<WaitingUser>(entriesRecentFn.size()); 
			for(int i=0; i<entriesRecentFn.size(); i++){
				tempEntriesRecentFn.add(entriesRecentFn.get(entriesRecentFn.size()-1-i));
			}
			return tempEntriesRecentFn;
		}
		
		/**
		 * 서버로부터 받아온 대기목록 데이터를 처리하여 화면에 보여준다.
		 */
		public void processWaitStatusData(String callResult){
			try {
				// 데이터 세팅부..
//				Log.d(TAG,"processWaitStatusData tempstr:"+tempstr);
				JSONArray jsonArray = null;
				jsonArray = new JSONArray(callResult);
				max = jsonArray.length();
				
				String tmpIdWaitingUsers = "";
				String tmpUserName = "";
				String tmpQrCode = "";
				String tmpPhoneNumber = "";
				String tmpNumberWaiting = "";
				String tmpCompanion = "";
				String tmpAdmissionYn = "";
				String tmpNextTurnYn = "";
				String tmpActivateYn = "";
				String tmpModifyDate = "";
				String tmpRegisterDate = "";
				
				if(max>0){
					entriesFn = new ArrayList<WaitingUser>(max);
					for ( int i = 0; i < max; i++ ){
						JSONObject jsonObj;
						try {
							jsonObj = jsonArray.getJSONObject(i);	
							String tmpRegisterDate2 = "";	// 형식 변환해서 저장용
							int dayOfRegisterDate = 0;	// 오전 오후 분간용
							String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
							String strAMPM = "";
							try{
								tmpIdWaitingUsers =jsonObj.getString("idWaitingUsers");
							}catch(Exception e){
								tmpIdWaitingUsers = "";
							}
							try{
								tmpUserName =jsonObj.getString("userName");
							}catch(Exception e){
								tmpUserName = "";
							}
							try{
								tmpQrCode =jsonObj.getString("qrCode");
							}catch(Exception e){
								tmpQrCode = "";
							}
							try{
								tmpPhoneNumber =jsonObj.getString("phoneNumber");
							}catch(Exception e){
								tmpPhoneNumber = "";
							}
							try{
								tmpNumberWaiting =jsonObj.getString("numberWaiting");
							}catch(Exception e){
								tmpNumberWaiting = "";
							}
							try{
								tmpCompanion =jsonObj.getString("companion");
							}catch(Exception e){
								tmpCompanion = "";
							}
							try{
								tmpAdmissionYn =jsonObj.getString("admissionYn");
							}catch(Exception e){
								tmpAdmissionYn = "";
							}
							try{
								tmpNextTurnYn =jsonObj.getString("nextTurnYn");
							}catch(Exception e){
								tmpNextTurnYn = "";
							}
							try{
								tmpActivateYn =jsonObj.getString("activateYn");
							}catch(Exception e){
								tmpActivateYn = "";
							}
							try{
								tmpRegisterDate =jsonObj.getString("registerDate");

								// 길면 자르기
								if(tmpRegisterDate!=null &&(tmpRegisterDate.length()>19)){
									tmpRegisterDate = tmpRegisterDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
								}
								
								// 오전 오후 분간하기
								dayOfRegisterDate = Integer.parseInt(tmpRegisterDate.substring(11, 13));	// dayOfRegisterDate
								if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
									dayOfRegisterDate = dayOfRegisterDate - 12;
									strAMPM = getActivity().getString(R.string.pm_of_day)+"";
								}else{				// 12시 이전 = 오전
									strAMPM = getActivity().getString(R.string.am_of_day)+"";
								}
								
								// 두자리로 맞추기.
								dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
								if(dayOfRegisterDate<10){		
									dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
								}
								
//								// 원하는 날짜 형식에 맞춰서 데이터 넣기
//								tmpRegisterDate2 = tmpRegisterDate.substring(0, 4)+getActivity().getString(R.string.year) +tmpRegisterDate.substring(5, 7) + getActivity().getString(R.string.month) + tmpRegisterDate.substring(8, 10) + getActivity().getString(R.string.day) + " " + strAMPM + " " + dayOfRegisterDateStr + tmpRegisterDate.substring(13);
								
								// 원하는 날짜 형식에 맞춰서 데이터 넣기
								tmpRegisterDate2 = 
									tmpRegisterDate.substring(0, 4)+getString(R.string.year) 
									+tmpRegisterDate.substring(5, 7) + getString(R.string.month) 
									+tmpRegisterDate.substring(8, 10) + getString(R.string.day) 
									+ " " + strAMPM + " " 
									+dayOfRegisterDateStr + getString(R.string.hour) 
									+tmpRegisterDate.substring(14, 16) + getString(R.string.minute) 
									+tmpRegisterDate.substring(17, 19) + getString(R.string.seconds);
//									+tmp_registerDate.substring(13);
								tmpRegisterDate = tmpRegisterDate2;	
								
								
							}catch(Exception e){
								tmpRegisterDate2 = "";
							}
							try{
								tmpModifyDate =jsonObj.getString("modifyDate");
							}catch(Exception e){
								tmpModifyDate = "";
							}
							entriesFn.add(
									new WaitingUser(
											tmpIdWaitingUsers,
											tmpUserName,
											tmpQrCode,		
											tmpPhoneNumber,
											tmpNumberWaiting,
											tmpCompanion,
											tmpAdmissionYn, 
											tmpNextTurnYn,
											tmpActivateYn,
											tmpRegisterDate2,
											tmpModifyDate,
											tmpFirstItem
									)
							);
							tmpFirstItem = false;
						} catch (JSONException e) {
							e.printStackTrace();
						} 
					}
				}else{		// 데이터 없음.
					entriesFn = null;
				}
				
				if(entranceMode){				
					Log.d(TAG,"entranceMode//totalCount::"+totalCount);
					// 입장 절차 진행			인원수에 따라 다름.
					if(totalCount.equals("0")){		// 0명  
						// 입장할게 없음. 그냥 끝. --> 목록 갱신.
					}else if(totalCount.equals("1")){		// 1명 -> 입장만 하고 끝 --> 목록 갱신
						// 다음 고객 입장..
						handler.sendEmptyMessage(ENTRANCE_NEXT_PERSON);							// 1명짜리 고객 입장 !
					}else{		//	2명 이상 -> 
						handler.sendEmptyMessage(UPDATE_USER_ADMISSIONYN_AND_USER_NEXTTURNYN);  // 2명 이상일때 다음 고객 입장 !
					}
				}else{			// 일반 모드 - 그냥 보여준다.
					try {
						hidePb();
						threadShowList();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				needRefreshYn = false;		// 화면 데이터 갱신 이후 false 로 돌려놓는다 
			} catch (JSONException e) {
				e.printStackTrace();
			} 
			countOne = true;
		}
		
		////////////////////////	Util	///////////////////////////////////////////////////////////////////////	
		/**
		 * returnThis
		 *  컨택스트 리턴한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public Context returnThis(){
			return getActivity();
		}

		/*
		 * 핸들러를 통한 작업.
		 */
		/**
		 * showMsg
		 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
		 *
		 * @param msg
		 * @param
		 * @return
		 */
		public void showMsg(final String msg){		
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){	 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showToast", 1);
						b.putString("msg", msg);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		} 

		/**
		 * showResultDialog
		 *  얼럿 띄운다
		 *
		 * @param msg
		 * @param
		 * @return 
		 */
		public void showResultDialog(final String msg){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){	 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		// 확인을 받는 컨펌 창을 띄운다
		/**
		 * showConfirmDialog
		 *  확인을 받는 컨펌 창을 띄운다
		 *
		 * @param showConfirmCode
		 * @param msg
		 * @return 
		 */
		public void showConfirmDialog(final int showConfirmCode, final String msg){
			if(getActivity()!=null){
				getActivity().runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showConfirm", showConfirmCode);		 
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}

		// 중앙 프로그래스바 보임, 숨김
		/**
		 * showPb
		 *  중앙 프로그래스바 가시화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void showPb(){
			new Thread( 
					new Runnable(){
						public void run(){
							Message message = handler .obtainMessage();
							Bundle b = new Bundle();
							b.putInt( "order" , 1);
							message.setData(b);
							handler .sendMessage(message);
						}
					}
			).start();
		}
		/**
		 * hidePb
		 *  중앙 프로그래스바 비가시화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void hidePb(){
			new Thread(
					new Runnable(){
						public void run(){
							Message message = handler .obtainMessage();
							Bundle b = new Bundle();
							b.putInt( "order" , 2);
							message.setData(b);
							handler .sendMessage(message);
						}
					}
			).start();
		}

		/**
		 * onResume
		 *  액티비티 리쥼시 닫기 카운터초기화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		@Override
		public void onResume(){
			super.onResume();
			isFinished = false;
			FragmentHome.app_end = 0;
		}
		@Override
		public void onPause(){
			super.onPause();
			isFinished = true;
		}

	}
